// 数组

let list: Array<number> = [1,2,3]
let list1: number[] = [1, 2, 3]

// 枚举
enum direction  {
  NORTH=3,
  SOURTH,
  EAST,
  WEAST
}

// 默认情况下，NORTH 的初始值为 0，其余的成员会从 1 开始自动增长。
// 换句话说，Direction.SOUTH 的值为 1，Direction.EAST 的值为 2，Direction.WEST 的值为 3。

let value: any;

value.foo.bar;
value.trim();
value();

// any 类型本质上是类型系统的一个逃逸舱。作为开发者，这给了我们很大的自由：TypeScript允许我们对 `any` 类型的值执行任何操作
// 而无需事先执行任何形式的检查：
// 在许多场景下，这太宽松了，使用any类型，可以很容易地编写类型正确但在运行时有问题的代码。为了解决 any 
// 带来的问题，TypeScript 3.0 引入了 unknown 类型

let values: unknown;

values = true;
values = 42;
values = 'Hello World';
values = [];
values = {};
values = Math.random;
values = null;
values = undefined;
values = new TypeError();
values = Symbol("type")

let value0: unknown;

let value1: unknown = value0; // ok
let value2: any = value0; // ok

let value3: boolean = value0; // Type 'unknown' is not assignable to type 'boolean'.
let value4: number = value0; // Type 'unknown' is not assignable to type 'number'.
let value5: string = value0; // Type 'unknown' is not assignable to type 'string'.
let value6: object = value0; // Type 'unknown' is not assignable to type 'object'.
let value7: any[] = value0; // Type 'unknown' is not assignable to type 'any[]'.
let value8: Function = value0; // Type 'unknown' is not assignable to type 'Function'.

let Value: unknown;

Value.foo.bar; // Object is of type 'unknown'.
Value.trim(); // Object is of type 'unknown'.
Value(); // Object is of type 'unknown'.
new Value(); // Object is of type 'unknown'.
Value[0][1]; // Object is of type 'unknown'.

// 元组
let tupleType: [string, boolean];
tupleType = ['semlinker', true];

// 与数组一样，我们可以通过下标来访问元组中的元素：
console.log(tupleType[0]); // semlinker
console.log(tupleType[1]); // true

const proto = {}

Object.create(proto); // ok
Object.create(null); // ok
Object.create(undefined); // Error
Object.create(1337); // Error
Object.create(true); // Error
Object.create('oops'); // Error